package br.com.iswe.gwt.ui.client;


public class RangeDateValidator extends BaseValidator {

	private DateBox dataInicio;
	private DateBox dataFim;
	private String labelDataInicio;
	private String labelDataFim;
	
	public RangeDateValidator(String nome, String labelDataInicio, String labelDataFim, DateBox dataInicio, DateBox dataFim) {
		super(nome, null, null);
		this.dataInicio = dataInicio;
		this.dataFim = dataFim;
		this.labelDataInicio = labelDataInicio;
		this.labelDataFim = labelDataFim;
	}

	protected boolean validateImpl() {
		//verifica se as duas datas sao validas e nao estao vazias
		if(isEmpty( dataInicio.getDateTextBox().getText() ) && isEmpty( dataFim.getDateTextBox().getText() ) ){
			//caso as duas sejam vazias
			return true;
		}
		//verifica se alguma das datas esta vazia
		if(isEmpty( dataInicio.getDateTextBox().getText() )){
			//Apenas a data de inicio esta vazia
			notValid(dataInicio, commonMessages.msgRangeDatasInvalido(labelDataInicio, labelDataFim));
			return false;
		}
		if(isEmpty( dataFim.getDateTextBox().getText() )){
			//Apenas a data de fim esta vazia
			notValid(dataFim, commonMessages.msgRangeDatasInvalido(labelDataInicio, labelDataFim));
			return false;
		}
		
		DateValidator dateValidator = new DateValidator();
		//verifica se sao validas
		if(! dateValidator.isValid(dataInicio) ||  ! dateValidator.isValid(dataFim)){
			//caso algum das duas datas nao sejam validas
			return false;
		}
		
		//as datas sao validas e nao estao vazias.
		//concatena os dados da data na ordem invertida.
		DateInfo dateInfo = DateInfo.getInstance(dataInicio.getDateTextBox());
		long lDataInicio = dateInfo.getLongValue();
		
		dateInfo = DateInfo.getInstance(dataFim.getDateTextBox());
		long lDataFim = dateInfo.getLongValue();
		
		boolean result = lDataInicio <= lDataFim;
		if(result){
			valid(dataInicio);
			valid(dataFim);
		}
		else{
			notValid(dataInicio, commonMessages.msgRangeDatasInvalido(labelDataInicio, labelDataFim));
			notValid(dataFim, commonMessages.msgRangeDatasInvalido(labelDataInicio, labelDataFim));
		}
		return  result;//retorna valido caso a data inicio seja menor ou igual data fim.
	}

}
